﻿using System;
using System.Web;
using System.Web.Mvc;
using PortalCurriculo.Domain;

namespace PortalCurriculo.MvcWebUI.Helpers
{
    public class UserAuthorizeAttribute : AuthorizeAttribute
    {
        public enum UserTypes
        {
            PessoaFisica,
            PessoaJuridica,
            Profissional,
            Selecionador,
            Administrador,
            Redator,
            Parceiro,
            Empresa
        }

        public UserTypes UserType { get; set; }

        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);

            if (filterContext.Result != null && filterContext.Result.GetType() == typeof(HttpUnauthorizedResult)) return;

            switch (UserType)
            {
                case UserTypes.PessoaFisica:
                    if (!PessoaFisicaLogada)
                        HandleUnauthorizedRequest(filterContext);
                    break;
                case UserTypes.Profissional:
                    if (!PessoaFisicaLogada || !ProfissionalLogado)
                        HandleUnauthorizedRequest(filterContext);
                    break;
                case UserTypes.Administrador:
                    if (!PessoaFisicaLogada || !AdministradorLogado)
                        HandleUnauthorizedRequest(filterContext);
                    break;
                case UserTypes.Empresa:
                    if (!PessoaJuridicaLogada || !EmpresaLogada)
                        HandleUnauthorizedRequest(filterContext);
                    break;
                case UserTypes.Parceiro:
                    if (!PessoaJuridicaLogada || !ParceiroLogado)
                        HandleUnauthorizedRequest(filterContext);
                    break;
                case UserTypes.PessoaJuridica:
                    if (!PessoaJuridicaLogada)
                        HandleUnauthorizedRequest(filterContext);
                    break;
                case UserTypes.Redator:
                    if (!PessoaFisicaLogada || !RedatorLogado)
                        HandleUnauthorizedRequest(filterContext);
                    break;
                case UserTypes.Selecionador:
                    if (!PessoaFisicaLogada|| !SelecionadorLogado)
                        HandleUnauthorizedRequest(filterContext);
                    break;
            }

            if (filterContext.Result != null && filterContext.Result.GetType() == typeof(HttpUnauthorizedResult)) return;

            var cachePolicy = filterContext.HttpContext.Response.Cache;
            cachePolicy.SetProxyMaxAge(new TimeSpan(0));
            cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
        }

        private bool ProfissionalLogado { get { return Session.ContextSession(Session.SessionName.ProfissionalLogado) != null; } }
        private bool AdministradorLogado { get { return Session.ContextSession(Session.SessionName.AdministradorLogado) != null; } }
        private bool SelecionadorLogado { get { return Session.ContextSession(Session.SessionName.SelecionadorLogado) != null; } }
        private bool EmpresaLogada { get { return Session.ContextSession(Session.SessionName.EmpresaLogada) != null; } }
        private bool RedatorLogado { get { return Session.ContextSession(Session.SessionName.RedatorLogado) != null; } }
        private bool ParceiroLogado { get { return Session.ContextSession(Session.SessionName.ParceiroLogado) != null; } }

        private bool PessoaFisicaLogada
        {
            get
            {
                return Session.ContextSession(Session.SessionName.UsuarioLogado) != null &&
                       Session.ContextSession<Usuario>(Session.SessionName.UsuarioLogado).Pessoa.PessoaFisica != null;
            }
        }
        private bool PessoaJuridicaLogada
        {
            get
            {
                return Session.ContextSession(Session.SessionName.UsuarioLogado) != null &&
                    Session.ContextSession<Usuario>(Session.SessionName.UsuarioLogado).Pessoa.GetType() ==
                    typeof(PessoaJuridica);
            }
        }

        private void CacheValidateHandler(HttpContext context, object data, ref HttpValidationStatus validationStatus)
        {
            validationStatus = OnCacheAuthorization(new HttpContextWrapper(context));
        }
    }
}